# coding=utf-8
"""
@author: jiajiknag
程序功能： 微信个性签名分析
"""
# 导包
# itchat实现微信个人号接口，itchat是一个开源的微信个人号接口。
import itchat
import numpy as np
import os
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']#绘图时可以显示中文
plt.rcParams['axes.unicode_minus']=False#绘图时可以显示中文
# 词云
from wordcloud import WordCloud,STOPWORDS,ImageColorGenerator
# PTL图像处理的库
from PIL import Image
import time
# 正则表达式库
import re
# 文本分析库
import snownlp
# 结巴分词
import jieba
import jieba.analyse

def fun_analyse_Signature(friends):
    # 个性签名分析
    signatures = ''
    # 定义一个空列表
    emotions = []
    # 遍历freinds
    for friend in friends:
        signature = friend['Signature']
        # 如果不为空
        if signature != None:
            # 去除无关数据：空格，表情等等
            signature = signature.strip().replace("span","").replace("class","").replace("emoji","")
            signature = re.sub(r'1f(\d.+)',"",signature)
        # 如果存在个性签名
        if len(signature) > 0:
            # SnowNLP是一个python写的类库，可以方便的处理中文文本内容：这里就是处理个性签名
            nlp = snownlp.SnowNLP(signature)
            # 添加权值
            emotions.append(nlp.sentiments)#nlp.sentiments：权值
            # 关键字提取
            signatures += " ".join(jieba.analyse.extract_tags(signature,5))
    back_coloring = np.array(Image.open("jjk.jpg"))#图片可替换
    # 设置词云样式
    word_cloud2 = WordCloud(font_path = 'simkai.ttf',# 为中文设置的字体
                         background_color = 'white',# 设置背景颜色
                         max_words = 1200,# 设置最大实现的字数
                         mask = back_coloring,# 设置背景颜色
                         margin = 15)
    # 生成器generate()执行signatures
    word_cloud2.generate(signatures)
    # 开始加载文本
    # 改变字体颜色
    image_colors = ImageColorGenerator(back_coloring)
    # 创建图
    plt.figure(figsize=(8,5),dpi=160)
    # 显示词云图
    plt.imshow(word_cloud2.recolor(color_func=image_colors))
    # 是否显示x轴、y轴下标
    plt.axis("off")
    plt.show()
    # 保存
    word_cloud2.to_file("signatures.jpg")
    print("个性签名生成词云成功")

    # lambda表达式
    count_positive = len(list(filter(lambda x:x>0.66,emotions)))#大于0.66为积极
    count_negative = len(list(filter(lambda x:x<0.33,emotions)))#小于0.33为消极
    count_neutral = len(list(filter(lambda x:x>=0.33 and x <= 0.66,emotions)))
    # 创建一个列表
    labels = [u'积极',u'中性',u'消极']
    values =(count_positive,count_neutral,count_negative)
    # #绘图时可以显示中文
    plt.rcParams['font.sans-serif'] = ['simHei']
    plt.rcParams['axes.unicode_minus'] = False
    # X轴
    plt.xlabel("情感判断")
    # y轴
    plt.ylabel("频数")
    # 设置x轴的值域
    plt.xticks(range(3),labels)
    # 添加图例
    plt.legend(loc='upper right')
    #绘制柱形图
    plt.bar(range(3),values,color='rgb')
    # 标题
    plt.title(u'%s的微信好友签名信息情感分析情况' % friends[0]['NickName'])
    plt.savefig("情感分析柱状图.jpg")
    plt.show()
    print("情感分析柱状图分析完成！！！")


if __name__=="__main__":
    # 在登陆的时候使用命令行显示二维码，也就是运行程序会生成一个微信二维码奥
    # 且即使程序关闭，一定时间内重新开启也可以不用重新扫码。
    itchat.auto_login(hotReload=True)
    # 好友搜索
    friends = itchat.get_friends(update=True)
    # 调用函数
    fun_analyse_Signature(friends)